package com.pl.controller;

import com.pl.common.JsonResult;
import com.pl.domain.User;
import com.pl.listener.myEvent.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 * @author shent
 */
@RestController
@RequestMapping("listener")
public class TestListenerController {

    @Autowired
    UserService userService;

    /**
     * 从 application 域中获取 user 信息,减少每次都对数据库的访问
     *
     * @param request
     * @return
     */
    @GetMapping("user")
    public JsonResult<User> getUser(HttpServletRequest request) {
        ServletContext application = request.getServletContext();
        return new JsonResult<>((User) application.getAttribute("user"));
    }

    /**
     * 获取当前在线人数，该方法有bug
     * <p>
     * 该 Controller 中是直接获取当前 session 中的用户数量，启动服务器，
     * 在浏览器中输入 localhost:8080/listener/total 可以看到返回的结果是1，
     * 再打开一个浏览器，请求相同的地址可以看到 count 是 2 ，
     * 这没有问题。但是如果关闭一个浏览器再打开，理论上应该还是2，
     * 但是实际测试却是 3。
     * 原因是 session 销毁的方法没有执行（可以在后台控制台观察日志打印情况），
     * 当重新打开时，服务器找不到用户原来的 session，于是又重新创建了一个 session
     *
     * @param request
     * @return
     */
    @GetMapping("total")
    public String getTotalUser(HttpServletRequest request) {
        Integer count = (Integer) request.getSession().getServletContext().getAttribute("count");
        return "当前在线人数：" + count;
    }

    /**
     * 该处理逻辑是让服务器记得原来那个 session，
     * 即把原来的 sessionId 记录在浏览器中，
     * 下次再打开时，把这个 sessionId 传过去，
     * 这样服务器就不会重新再创建了
     *
     * @param request
     * @param response
     * @return
     */
    @GetMapping("total2")
    public String getTotalUser2(HttpServletRequest request, HttpServletResponse response) {
        Cookie cookie;
        try {
            // 把sessionId记录在浏览器中
            cookie = new Cookie("JSESSIONID", URLEncoder.encode(request.getSession().getId(), "utf-8"));
            cookie.setPath("/");
            //设置cookie有效期为2天，设置长一点
            cookie.setMaxAge(2 * 24 * 60 * 60);
            response.addCookie(cookie);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        Integer count = (Integer) request.getSession().getServletContext().getAttribute("count");
        return "当前在线人数：" + count;
    }

    @GetMapping("/publish")
    public JsonResult<User> getRequestInfo(HttpServletRequest request) {
        System.out.println("requestListener中的初始化的name数据：" + request.getAttribute("name"));
        return new JsonResult<>(userService.getUser2());
    }
}
